/*
 * 此文件实现了一个由预处理器构建和维护的数据结构。
 *
 * 所有可以处理的主机变量声明类型最终都必须得到处理。
 *
 * src/interfaces/ecpg/include/ecpgtype.h
 */

/*
 * 这里是我们要处理的所有类型。请注意，注册的是类型，与存储
 * 类没有任何关系。
 *
 * 简单类型
 * 整数：char, short, int, long（有符号和无符号）
 * 浮点数：float, double
 *
 * 复杂类型：
 * VARCHAR, VARCHAR2 - 具有长度的字符串（maxlen 在声明中给出）
 * 简单类型和 VARCHAR, VARCHAR2 的数组（大小在声明中给出）
 * 由简单类型、数组和其他结构构成的记录。
 *
 * 复杂化的因素：
 * typedefs 和结构名称！
 *
 * 结论：
 * 这是一种典型的递归定义。一个类型列表元素的结构可能会很好地工作：
 */

#ifndef _ECPGTYPE_H
#define _ECPGTYPE_H

#ifdef __cplusplus
extern "C"
{
#endif

enum ECPGttype
{
	ECPGt_char = 1, ECPGt_unsigned_char, ECPGt_short, ECPGt_unsigned_short,
	ECPGt_int, ECPGt_unsigned_int, ECPGt_long, ECPGt_unsigned_long,
	ECPGt_long_long, ECPGt_unsigned_long_long,
	ECPGt_bool,
	ECPGt_float, ECPGt_double,
	ECPGt_varchar, ECPGt_varchar2,
	ECPGt_numeric,				/* 这是一个存储其数字在
								 * malloc 的数组中的十进制数 */
	ECPGt_decimal,				/* 这是一个存储其数字在
								 * 固定数组中的十进制数 */
	ECPGt_date,
	ECPGt_timestamp,
	ECPGt_interval,
	ECPGt_array,
	ECPGt_struct,
	ECPGt_union,
	ECPGt_descriptor,			/* sql 描述符，没有 C 变量 */
	ECPGt_char_variable,
	ECPGt_const,				/* 有时需要常量 */
	ECPGt_EOIT,					/* 插入类型结束。 */
	ECPGt_EORT,					/* 结果类型结束。 */
	ECPGt_NO_INDICATOR,			/* 没有指示符 */
	ECPGt_string,				/* 修剪过的 (char *) 类型 */
	ECPGt_sqlda,				/* C 结构描述符 */
	ECPGt_bytea
};

 /* 描述符项目 */
enum ECPGdtype
{
	ECPGd_count = 1,
	ECPGd_data,
	ECPGd_di_code,
	ECPGd_di_precision,
	ECPGd_indicator,
	ECPGd_key_member,
	ECPGd_length,
	ECPGd_name,
	ECPGd_nullable,
	ECPGd_octet,
	ECPGd_precision,
	ECPGd_ret_length,
	ECPGd_ret_octet,
	ECPGd_scale,
	ECPGd_type,
	ECPGd_EODT,					/* 描述符类型结束。 */
	ECPGd_cardinality
};

#define IS_SIMPLE_TYPE(type) (((type) >= ECPGt_char && (type) <= ECPGt_interval) || ((type) == ECPGt_string) || ((type) == ECPGt_bytea))

/* 我们还必须处理不同的语句类型 */
enum ECPG_statement_type
{
	ECPGst_normal,
	ECPGst_execute,
	ECPGst_exec_immediate,
	ECPGst_prepnormal,
	ECPGst_prepare,
	ECPGst_exec_with_exprlist
};

#ifdef __cplusplus
}
#endif

#endif							/* _ECPGTYPE_H */
